package org.gap.service;

import java.util.List;
import java.util.Set;

import org.gap.dao.AdressesDAO;
import org.gap.dao.CodesPostauxDAO;
import org.gap.dao.UtilisateursDAO;

import org.gap.domain.Adresses;
import org.gap.domain.CodesPostaux;
import org.gap.domain.Utilisateurs;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for Adresses entities
 * 
 */

@Service("AdressesService")
@Transactional
public class AdressesServiceImpl implements AdressesService {

	/**
	 * DAO injected by Spring that manages Adresses entities
	 * 
	 */
	@Autowired
	private AdressesDAO adressesDAO;

	/**
	 * DAO injected by Spring that manages CodesPostaux entities
	 * 
	 */
	@Autowired
	private CodesPostauxDAO codesPostauxDAO;

	/**
	 * DAO injected by Spring that manages Utilisateurs entities
	 * 
	 */
	@Autowired
	private UtilisateursDAO utilisateursDAO;

	/**
	 * Instantiates a new AdressesServiceImpl.
	 *
	 */
	public AdressesServiceImpl() {
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public Adresses deleteAdressesUtilisateursByAddUserCreation(Integer adresses_addAdresse, String related_utilisateursbyaddusercreation_usrUser) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(adresses_addAdresse, -1, -1);
		Utilisateurs related_utilisateursbyaddusercreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyaddusercreation_usrUser, -1, -1);

		adresses.setUtilisateursByAddUserCreation(null);
		related_utilisateursbyaddusercreation.getAdressesesForAddUserCreation().remove(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_utilisateursbyaddusercreation = utilisateursDAO.store(related_utilisateursbyaddusercreation);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbyaddusercreation);
		utilisateursDAO.flush();

		return adresses;
	}

	/**
	 */
	@Transactional
	public Adresses findAdressesByPrimaryKey(Integer addAdresse) {
		return adressesDAO.findAdressesByPrimaryKey(addAdresse);
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public Adresses saveAdressesUtilisateursByAddUserCreation(Integer addAdresse, Utilisateurs related_utilisateursbyaddusercreation) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(addAdresse, -1, -1);
		Utilisateurs existingutilisateursByAddUserCreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyaddusercreation.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByAddUserCreation != null) {
			existingutilisateursByAddUserCreation.setUsrUser(related_utilisateursbyaddusercreation.getUsrUser());
			existingutilisateursByAddUserCreation.setUsrPassword(related_utilisateursbyaddusercreation.getUsrPassword());
			existingutilisateursByAddUserCreation.setUsrService(related_utilisateursbyaddusercreation.getUsrService());
			existingutilisateursByAddUserCreation.setUsrMail(related_utilisateursbyaddusercreation.getUsrMail());
			existingutilisateursByAddUserCreation.setUsrEnabled(related_utilisateursbyaddusercreation.getUsrEnabled());
			related_utilisateursbyaddusercreation = existingutilisateursByAddUserCreation;
		} else {
			related_utilisateursbyaddusercreation = utilisateursDAO.store(related_utilisateursbyaddusercreation);
			utilisateursDAO.flush();
		}

		adresses.setUtilisateursByAddUserCreation(related_utilisateursbyaddusercreation);
		related_utilisateursbyaddusercreation.getAdressesesForAddUserCreation().add(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_utilisateursbyaddusercreation = utilisateursDAO.store(related_utilisateursbyaddusercreation);
		utilisateursDAO.flush();

		return adresses;
	}

	/**
	 * Load an existing Adresses entity
	 * 
	 */
	@Transactional
	public Set<Adresses> loadAdressess() {
		return adressesDAO.findAllAdressess();
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public Adresses deleteAdressesUtilisateursByAddUserModification(Integer adresses_addAdresse, String related_utilisateursbyaddusermodification_usrUser) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(adresses_addAdresse, -1, -1);
		Utilisateurs related_utilisateursbyaddusermodification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyaddusermodification_usrUser, -1, -1);

		adresses.setUtilisateursByAddUserModification(null);
		related_utilisateursbyaddusermodification.getAdressesesForAddUserModification().remove(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_utilisateursbyaddusermodification = utilisateursDAO.store(related_utilisateursbyaddusermodification);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbyaddusermodification);
		utilisateursDAO.flush();

		return adresses;
	}

	/**
	 * Return a count of all Adresses entity
	 * 
	 */
	@Transactional
	public Integer countAdressess() {
		return ((Long) adressesDAO.createQuerySingleResult("select count(o) from Adresses o").getSingleResult()).intValue();
	}

	/**
	 * Save an existing Adresses entity
	 * 
	 */
	@Transactional
	public void saveAdresses(Adresses adresses) {
		Adresses existingAdresses = adressesDAO.findAdressesByPrimaryKey(adresses.getAddAdresse());

		if (existingAdresses != null) {
			if (existingAdresses != adresses) {
				existingAdresses.setAddAdresse(adresses.getAddAdresse());
				existingAdresses.setAddTopNpai(adresses.getAddTopNpai());
				existingAdresses.setAddTypeVoie(adresses.getAddTypeVoie());
				existingAdresses.setAddLigne1(adresses.getAddLigne1());
				existingAdresses.setAddLigne2(adresses.getAddLigne2());
				existingAdresses.setAddLigne3(adresses.getAddLigne3());
				existingAdresses.setAddBureauDistrib(adresses.getAddBureauDistrib());
				existingAdresses.setAddDateCreation(adresses.getAddDateCreation());
				existingAdresses.setAddDateModification(adresses.getAddDateModification());
			}
			adresses = adressesDAO.store(existingAdresses);
		} else {
			adresses = adressesDAO.store(adresses);
		}
		adressesDAO.flush();
	}

	/**
	 * Delete an existing Adresses entity
	 * 
	 */
	@Transactional
	public void deleteAdresses(Adresses adresses) {
		adressesDAO.remove(adresses);
		adressesDAO.flush();
	}

	/**
	 * Save an existing CodesPostaux entity
	 * 
	 */
	@Transactional
	public Adresses saveAdressesCodesPostaux(Integer addAdresse, CodesPostaux related_codespostaux) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(addAdresse, -1, -1);
		CodesPostaux existingcodesPostaux = codesPostauxDAO.findCodesPostauxByPrimaryKey(related_codespostaux.getCdpPays(), related_codespostaux.getCdpCodePostal(), related_codespostaux.getCdpNInsee(), related_codespostaux.getCdpLocalite());

		// copy into the existing record to preserve existing relationships
		if (existingcodesPostaux != null) {
			existingcodesPostaux.setCdpPays(related_codespostaux.getCdpPays());
			existingcodesPostaux.setCdpCodePostal(related_codespostaux.getCdpCodePostal());
			existingcodesPostaux.setCdpNInsee(related_codespostaux.getCdpNInsee());
			existingcodesPostaux.setCdpLocalite(related_codespostaux.getCdpLocalite());
			existingcodesPostaux.setCdpBureauDistributeur(related_codespostaux.getCdpBureauDistributeur());
			existingcodesPostaux.setCdpParticuCommuneLieuDit(related_codespostaux.getCdpParticuCommuneLieuDit());
			existingcodesPostaux.setCdpParticuBureauDistrib(related_codespostaux.getCdpParticuBureauDistrib());
			existingcodesPostaux.setCdpCodeMiseAJour(related_codespostaux.getCdpCodeMiseAJour());
			existingcodesPostaux.setCdpLocaliteFiscalStandard(related_codespostaux.getCdpLocaliteFiscalStandard());
			related_codespostaux = existingcodesPostaux;
		} else {
			related_codespostaux = codesPostauxDAO.store(related_codespostaux);
			codesPostauxDAO.flush();
		}

		adresses.setCodesPostaux(related_codespostaux);
		related_codespostaux.getAdresseses().add(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_codespostaux = codesPostauxDAO.store(related_codespostaux);
		codesPostauxDAO.flush();

		return adresses;
	}

	/**
	 * Delete an existing CodesPostaux entity
	 * 
	 */
	@Transactional
	public Adresses deleteAdressesCodesPostaux(Integer adresses_addAdresse, String related_codespostaux_cdpPays, String related_codespostaux_cdpCodePostal, String related_codespostaux_cdpNInsee, String related_codespostaux_cdpLocalite) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(adresses_addAdresse, -1, -1);
		CodesPostaux related_codespostaux = codesPostauxDAO.findCodesPostauxByPrimaryKey(related_codespostaux_cdpPays, related_codespostaux_cdpCodePostal, related_codespostaux_cdpNInsee, related_codespostaux_cdpLocalite, -1, -1);

		adresses.setCodesPostaux(null);
		related_codespostaux.getAdresseses().remove(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_codespostaux = codesPostauxDAO.store(related_codespostaux);
		codesPostauxDAO.flush();

		codesPostauxDAO.remove(related_codespostaux);
		codesPostauxDAO.flush();

		return adresses;
	}

	/**
	 * Return all Adresses entity
	 * 
	 */
	@Transactional
	public List<Adresses> findAllAdressess(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<Adresses>(adressesDAO.findAllAdressess(startResult, maxRows));
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public Adresses saveAdressesUtilisateursByAddUserModification(Integer addAdresse, Utilisateurs related_utilisateursbyaddusermodification) {
		Adresses adresses = adressesDAO.findAdressesByPrimaryKey(addAdresse, -1, -1);
		Utilisateurs existingutilisateursByAddUserModification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyaddusermodification.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByAddUserModification != null) {
			existingutilisateursByAddUserModification.setUsrUser(related_utilisateursbyaddusermodification.getUsrUser());
			existingutilisateursByAddUserModification.setUsrPassword(related_utilisateursbyaddusermodification.getUsrPassword());
			existingutilisateursByAddUserModification.setUsrService(related_utilisateursbyaddusermodification.getUsrService());
			existingutilisateursByAddUserModification.setUsrMail(related_utilisateursbyaddusermodification.getUsrMail());
			existingutilisateursByAddUserModification.setUsrEnabled(related_utilisateursbyaddusermodification.getUsrEnabled());
			related_utilisateursbyaddusermodification = existingutilisateursByAddUserModification;
		} else {
			related_utilisateursbyaddusermodification = utilisateursDAO.store(related_utilisateursbyaddusermodification);
			utilisateursDAO.flush();
		}

		adresses.setUtilisateursByAddUserModification(related_utilisateursbyaddusermodification);
		related_utilisateursbyaddusermodification.getAdressesesForAddUserModification().add(adresses);
		adresses = adressesDAO.store(adresses);
		adressesDAO.flush();

		related_utilisateursbyaddusermodification = utilisateursDAO.store(related_utilisateursbyaddusermodification);
		utilisateursDAO.flush();

		return adresses;
	}
}
